home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / SCIENTIF / 0807.ZIP / TNODE.BAS < prev    next >
BASIC Source File  |  1987-09-29  |  12KB  |  454 lines

  1. ' PROGRAM "TNODE"
  2.  
  3. ' COPYRIGHT (C) 1983 BY DAVID EAGLE
  4.  
  5. ' IBM-PC  << QUICKBASIC COMPILER VERSION 3.0 >>
  6.  
  7. ' PUBLIC DOMAIN FOR IBM-PC ON NOVEMBER 20, 1986
  8.  
  9. ' COMPUTES ASCENDING NODE CROSSINGS OF EARTH SATELLITES
  10.  
  11. ' DATE OF CROSSING; MONTH, DAY, YEAR
  12. ' GMT OF CROSSING; HOURS, MINUTES, SECONDS
  13. ' WEST LONGITUDE OF CROSSING; DEGREES
  14.  
  15. '*********************************************************
  16.  
  17. DEFDBL A-Z
  18.  
  19. DIM SHARED MONTH$(12)
  20.  
  21. COMMON SHARED ECC,INC,ARGPER,TN,THOUR,TMIN,TSEC,CDATE$
  22. COMMON SHARED MONTH%,DAY%,YEAR%,JDATE,WLONG,CTIME$
  23.  
  24. CONST PI=3.141592653589793D0
  25. CONST PI2=2D0*PI
  26. CONST PIDIV2=.5D0*PI
  27. CONST DTR=PI/180D0
  28. CONST RTD=180D0/PI
  29. CONST MU=1.407645794D16
  30. CONST REQ=20925656.2D0
  31. CONST J2=.0010828D0
  32. CONST WE=7.29211515D-5
  33.  
  34. MONTH$(1)="January"
  35. MONTH$(2)="February"
  36. MONTH$(3)="March"
  37. MONTH$(4)="April"
  38. MONTH$(5)="May"
  39. MONTH$(6)="June"
  40. MONTH$(7)="July"
  41. MONTH$(8)="August"
  42. MONTH$(9)="September"
  43. MONTH$(10)="October"
  44. MONTH$(11)="November"
  45. MONTH$(12)="December"
  46.  
  47. '**********************************************************
  48.  
  49. CLS
  50. PRINT
  51. PRINT
  52. PRINT "Program TNODE"
  53. PRINT "(C) Copyright 1982 by David Eagle
  54. PRINT
  55. PRINT "Microsoft QuickBASIC Compiler"
  56. PRINT "(C) Copyright Microsoft Corp. 1982-1987"
  57. PRINT
  58. CALL KEYCHECK
  59.  
  60. CLS
  61. PRINT
  62. PRINT
  63. INPUT "Introduction ( y = yes, n = no )";A$
  64. IF INSTR("yY",A$) THEN CALL INTRO
  65.  
  66. ' PROMPT USER FOR INPUTS
  67.  
  68. CLS
  69. PRINT
  70. PRINT
  71. PRINT TAB(12);"Program TNODE"
  72. PRINT
  73. SATELLITE:
  74. PRINT
  75. PRINT "Orbital period ( minutes )"
  76. INPUT TKEPLER
  77. TKEPLER=TKEPLER*60
  78. PRINT
  79. PRINT "Orbital inclination ( degrees [ 0 - 180 ] )"
  80. INPUT INC
  81. INC=INC*DTR
  82. PRINT
  83. PRINT "Orbital eccentricity ( non-dimensional )"
  84. INPUT ECC
  85. IF ECC>0D0 THEN
  86.    PRINT
  87.    PRINT "Argument of perigee ( degrees [ 0 - 360 ] )"
  88.    INPUT ARGPER
  89.    ARGPER=ARGPER*DTR
  90. ELSE
  91.    ARGPER=0D0
  92. END IF
  93.  
  94. PRINT
  95. REVENT:
  96. CLS
  97. PRINT
  98. PRINT
  99. PRINT TAB(16);"Reference Event"
  100. PRINT
  101. PRINT
  102. PRINT TAB(10);"< 1 > Equatorial crossing"
  103. PRINT
  104. PRINT TAB(10);"< 2 > Apogee"
  105. PRINT
  106. PRINT
  107. PRINT "Selection"
  108. INPUT TYPE%
  109. PRINT
  110. PRINT
  111. PRINT "Date of reference event ( month [ 1 - 12 ], day [ 1 - 31 ], year [ YYYY ] )"
  112. PRINT "< For example, October 21, 1985 is input as 10,21,1985 >"
  113. INPUT MONTH%,DAY%,YEAR%
  114. PRINT
  115. PRINT "GMT of reference event"
  116. PRINT "( hours [ 0 - 23 ], minutes [ 0 - 59 ], seconds [ 0 - 59 ] )"
  117. PRINT "< For example, 8:45:30 p.m. is input as 20,45,30 >"
  118. INPUT THOUR,TMIN,TSEC
  119. PRINT
  120. PRINT "West longitude of reference event ( degrees [ 0 - 360 ] )"
  121. INPUT WLONG
  122. WLONG=WLONG*DTR
  123. PRINT
  124. PRINT "Number of crossings to compute"
  125. INPUT NCROSS%
  126.  
  127. CLS
  128. PRINT
  129. PRINT TAB(8);"CALENDAR";TAB(31);"GMT";TAB(50);"WEST";
  130. PRINT TAB(10);"DATE";TAB(31);"TIME";TAB(48);"LONGITUDE"
  131. PRINT
  132.  
  133. ' COMPUTE REFERENCE JULIAN DATE AND TIME BETWEEN CROSSINGS
  134.  
  135. JDATE=367D0*YEAR%-INT(7*((YEAR%+INT((MONTH%+9)/12))/4))+INT(275*MONTH%/9)+DAY%+1721014D0
  136. A=TKEPLER/PI2
  137. A=((MU*A*A)^(1D0/3D0))/REQ
  138. B=1D0+ECC*COS(ARGPER)
  139. C=1D0-ECC*ECC
  140. D=A*A
  141. E=B*B
  142. F=SIN(INC)
  143. G=COS(INC)
  144. H=1D0/(A*C)
  145. TN=TKEPLER*(1D0-.5D0*J2*((4D0-5D0*F*F)/(D*SQR(C)*E)+2D0*E*B/(C*C*C*D)))
  146. RDOT=-1.5D0*J2*PI2*H*H*G/TKEPLER
  147. DLONG=TN*(WE-RDOT)
  148. A2=TN/3600D0
  149. DHOUR=INT(A2)
  150. A4=60D0*(A2-DHOUR)
  151. DMIN=INT(A4)
  152. DSEC=INT(60D0*(A4-DMIN)+.5D0)
  153. IF TYPE%=2 THEN CALL APOGEE
  154. WLONG=WLONG-DLONG
  155. THOUR=THOUR-DHOUR
  156. TMIN=TMIN-DMIN
  157. TSEC=TSEC-DSEC
  158.  
  159. ' COMPUTE SUCCESSIVE CROSSINGS
  160.  
  161. FOR I%=1 TO NCROSS%+1
  162.     WLONG=WLONG+DLONG
  163.     IF WLONG>PI2 THEN WLONG=WLONG-PI2
  164.     THOUR=THOUR+DHOUR
  165.     TMIN=TMIN+DMIN
  166.     TSEC=TSEC+DSEC
  167.     CALL CTIME
  168.     CALL GDATE
  169.     CALL PRTSUB
  170. NEXT I%
  171.  
  172. PRINT
  173. CALL KEYCHECK
  174.  
  175. CLS
  176. PRINT
  177. PRINT
  178. INPUT "Another selection ( y = yes, n = no ) ";A$
  179. IF INSTR("nN",A$) THEN END
  180. PRINT
  181. INPUT "Another satellite ( y = yes, n = no ) ";A$
  182. IF INSTR("yY",A$) THEN GOTO SATELLITE
  183. PRINT
  184. INPUT "Another reference event ( y = yes, n = no ) ";A$
  185. IF INSTR("yY",A$) THEN GOTO REVENT
  186.  
  187. END
  188.  
  189. '**********************************************************
  190.  
  191. SUB GDATE STATIC
  192.  
  193.     ' GREGORIAN DATE SUBROUTINE
  194.  
  195.     A=INT((JDATE-1867216.25D0)/36524.25D0)
  196.     A=JDATE+A-INT(A/4D0)+1D0
  197.     B=A+1524D0
  198.     C=INT((B-122.1D0)/365.25D0)
  199.     D=INT(365.25D0*C)
  200.     E=INT((B-D)/30.6001D0)
  201.     DAY%=B-D-INT(30.6001D0*E)
  202.     IF E<13.5 THEN
  203.        MONTH%=E-1
  204.     ELSE
  205.        MONTH%=E-13
  206.     END IF
  207.     IF MONTH%>2.5 THEN
  208.        YEAR%=C-4716
  209.     ELSE
  210.        YEAR%=C-4715
  211.     END IF
  212.  
  213.     CDATE$=MONTH$(MONTH%)+STR$(DAY%)+","+STR$(YEAR%)
  214.  
  215. END SUB
  216.  
  217. '**********************************************************
  218.  
  219. SUB PRTSUB STATIC
  220.  
  221.     ' PRINT SUBROUTINE
  222.  
  223.     PRINT TAB(5);CDATE$;
  224.     PRINT ;TAB(26);CTIME$;
  225.     PRINT USING "###.##";TAB(48);WLONG*RTD
  226.  
  227. END SUB
  228.  
  229. '**********************************************************
  230.  
  231. SUB KEYCHECK STATIC
  232.  
  233.     ' CHECK USER RESPONSE SUBROUTINE
  234.  
  235.     PRINT
  236.     PRINT TAB(15);"< press any key to continue >";
  237.  
  238.     A$=""
  239.     WHILE A$=""
  240.       A$=INKEY$
  241.     WEND
  242.  
  243. END SUB
  244.  
  245. '**********************************************************
  246.  
  247. SUB INTRO STATIC
  248.  
  249.     ' INTRODUCTION SUBROUTINE
  250.  
  251.     CLS
  252.     PRINT TAB(10);"              INTRODUCTION              "
  253.     PRINT
  254.     PRINT TAB(10);"     PROGRAM 'TNODE' IS AN INTERACTIVE  "
  255.     PRINT TAB(10);"BASIC COMPUTER PROGRAM WHICH CAN BE USED"
  256.     PRINT TAB(10);"TO DETERMINE ASCENDING NODE CROSSINGS OF"
  257.     PRINT TAB(10);"EARTH SATELLITES. THE ASCENDING NODE IS "
  258.     PRINT TAB(10);"THE INTERSECTION OF THE EARTH'S EQUATORIAL"
  259.     PRINT TAB(10);"PLANE AND THE SATELLITE ORBIT PLANE AS"
  260.     PRINT TAB(10);"THE SATELLITE 'ASCENDS' FROM SOUTH TO"
  261.     PRINT TAB(10);"NORTH. THE TIME AND GEOGRAPHIC LONGITUDE"
  262.     PRINT TAB(10);"OF AN ASCENDING NODE CAN BE USED TO   "
  263.     PRINT TAB(10);"PREDICT THE SATELLITE'S POSITION AT OTHER"
  264.     PRINT TAB(10);"TIMES RELATIVE TO AN OBSERVER ANYWHERE"
  265.     PRINT TAB(10);"IN THE WORLD.                     "
  266.     PRINT
  267.     PRINT TAB(10);"       USER INPUTS AND SELECTIONS      "
  268.     PRINT
  269.     PRINT TAB(10);"    PROGRAM 'TNODE' WILL PROMPT THE USER"
  270.     PRINT TAB(10);"FOR SEVERAL INPUTS NECESSARY FOR THE    "
  271.     PRINT TAB(10);"SOFTWARE TO WORK PROPERLY. THIS IS A    "
  272.     PRINT TAB(10);"DESCRIPTION OF THESE REQUESTS AND A     "
  273.     PRINT TAB(10);"DISCUSSION OF THE PROPER USER RESPONSE. "
  274.     CALL KEYCHECK
  275.     CLS
  276.     PRINT
  277.     PRINT TAB(10);"Orbital period ( minutes )"
  278.     PRINT
  279.     PRINT TAB(10);"THE USER SHOULD RESPOND WITH THE ORBITAL"
  280.     PRINT TAB(10);"PERIOD OF THE SATELLITE IN MINUTES.     "
  281.     PRINT
  282.     PRINT TAB(10);"Orbital inclination ( degrees )"
  283.     PRINT
  284.     PRINT TAB(10);"THE RESPONSE TO THIS REQUEST SHOULD BE  "
  285.     PRINT TAB(10);"THE ORBITAL INCLINATION OF THE SATELLITE"
  286.     PRINT TAB(10);"IN DEGREES. THIS INPUT SHOULD BE A      "
  287.     PRINT TAB(10);"NUMBER BETWEEN 0 AND 180 DEGREES.       "
  288.     PRINT
  289.     PRINT TAB(10);"Orbital eccentricity ( non-dimensional )"
  290.     PRINT
  291.     PRINT TAB(10);"THE USER SHOULD INPUT THE ECCENTRICITY  "
  292.     PRINT TAB(10);"OF THE ORBIT. THIS IS A NON-DIMENSIONAL "
  293.     PRINT TAB(10);"NUMBER BETWEEN 0 AND 1.                 "
  294.     PRINT
  295.     PRINT TAB(10);"Argument of perigee ( degrees )"
  296.     PRINT
  297.     PRINT TAB(10);"THE USER SHOULD RESPOND WITH THE ORBIT'S"
  298.     PRINT TAB(10);"ARGUMENT OF PERIGEE IN DEGREES.         "
  299.     CALL KEYCHECK
  300.     CLS
  301.     PRINT
  302.     PRINT TAB(10);"            Reference Event             "
  303.     PRINT
  304.     PRINT TAB(10);"        <1> Equatorial crossing         "
  305.     PRINT
  306.     PRINT TAB(10);"        <2> Apogee                      "
  307.     PRINT
  308.     PRINT TAB(10);"Selection?                              "
  309.     PRINT
  310.     PRINT TAB(10);"HERE THE USER SHOULD INDICATE THE TYPE  "
  311.     PRINT TAB(10);"OF REFERENCE EVENT. MOST PREDICTIONS ARE"
  312.     PRINT TAB(10);"BASED ON EQUATORIAL CROSSINGS WHILE SOME"
  313.     PRINT TAB(10);"PREDICTIONS, SUCH AS THOSE FOR OSCAR 10,"
  314.     PRINT TAB(10);"ARE BASED ON APOGEE.                    "
  315.     PRINT
  316.     PRINT TAB(10);"Date of reference event ( month, day, year )?"
  317.     PRINT
  318.     PRINT TAB(10);"AT THIS POINT THE USER SHOULD INPUT THE "
  319.     PRINT TAB(10);"NUMERICAL EQUIVALENT OF THE DATE OF THE "
  320.     PRINT TAB(10);"REFERENCE EVENT. FOR EXAMPLE, MAY 12,   "
  321.     PRINT TAB(10);"1982 IS INPUT AS '5,12,1982'.           "
  322.     CALL KEYCHECK
  323.     CLS
  324.     PRINT
  325.     PRINT TAB(10);"GMT of reference event ( hours, minutes, seconds )?"
  326.     PRINT
  327.     PRINT TAB(10);"THE USER SHOULD RESPOND WITH THE GREENWICH"
  328.     PRINT TAB(10);"MEAN TIME (GMT), IN HOURS, MINUTES AND   "
  329.     PRINT TAB(10);"SECONDS CORRESPONDING TO THE REFERENCE  "
  330.     PRINT TAB(10);"EVENT DESCRIBED ABOVE.                  "
  331.     PRINT
  332.     PRINT TAB(10);"West longitude of reference event ( degrees )?"
  333.     PRINT
  334.     PRINT TAB(10);"THE RESPONSE TO THIS REQUEST SHOULD BE  "
  335.     PRINT TAB(10);"THE WEST LONGITUDE, IN DEGREES, OF THE  "
  336.     PRINT TAB(10);"REFERENCE EVENT. WEST LONGITUDE IS EQUAL"
  337.     PRINT TAB(10);"TO 360 DEGREES MINUS EAST LONGITUDE.    "
  338.     PRINT
  339.     PRINT TAB(10);"Number of crossings to compute?    "
  340.     PRINT
  341.     PRINT TAB(10);"THE USER SHOULD RESPOND WITH THE NUMBER "
  342.     PRINT TAB(10);"OF ADDITIONAL CROSSINGS THE PROGRAM     "
  343.     PRINT TAB(10);"SHOULD COMPUTE. DATA ABOUT THESE CROSSINGS"
  344.     PRINT TAB(10);"WILL BE BASED ON THE REFERENCE EVENT"
  345.     PRINT TAB(10);"DESCRIBED ABOVE.                  "
  346.     CALL KEYCHECK
  347.     CLS
  348.     PRINT
  349.     PRINT TAB(10);"  AFTER THE PROGRAM HAS RUN, IT WILL ASK"
  350.     PRINT TAB(10);"THE USER FOR ANOTHER SELECTION. THE USER"
  351.     PRINT TAB(10);"SHOULD RESPOND WITH 'Y' IF HE OR SHE    "
  352.     PRINT TAB(10);"DESIRES THE SELECTION OR 'N' IF NOT.    "
  353.     PRINT
  354.     PRINT TAB(10);"Another selection ( y = yes, n = no )?   "
  355.     PRINT
  356.     PRINT TAB(10);"THE USER SHOULD RESPOND WITH 'N' TO EXIT"
  357.     PRINT TAB(10);"THE PROGRAM.                            "
  358.     PRINT
  359.     PRINT TAB(10);"Another satellite ( y = yes, n = no )?   "
  360.     PRINT
  361.     PRINT TAB(10);"THE USER SHOULD SELECT 'Y' TO COMPUTE   "
  362.     PRINT TAB(10);"CROSSINGS FOR ANOTHER SATELLITE.        "
  363.     PRINT
  364.     PRINT TAB(10);"Another reference event ( y = yes, n = no )?  "
  365.     PRINT
  366.     PRINT TAB(10);"THE USER SHOULD INPUT 'Y' TO COMPUTE    "
  367.     PRINT TAB(10);"EQUATORIAL CROSSINGS BASED ON ANOTHER   "
  368.     PRINT TAB(10);"REFERENCE EVENT.                        "
  369.     CALL KEYCHECK
  370.     CLS
  371.     PRINT
  372.     PRINT TAB(10);"             PROGRAM OUTPUT"
  373.     PRINT
  374.     PRINT TAB(10);"PROGRAM 'TNODE' WILL OUTPUT THE CALENDAR"
  375.     PRINT TAB(10);"DATE, GMT AND WEST LONGITUDE OF ASCENDING"
  376.     PRINT TAB(10);"NODE CROSSINGS. GMT IS PRINTED IN HOURS,"
  377.     PRINT TAB(10);"MINUTES AND SECONDS AND THE WEST LONGITUDE"
  378.     PRINT TAB(10);"IS PRINTED IN DECIMAL DEGREES."
  379.     CALL KEYCHECK
  380.  
  381. END SUB
  382.  
  383. '**********************************************************
  384.  
  385. SUB APOGEE STATIC
  386.  
  387.     ' APOGEE EVENT SUBROUTINE
  388.  
  389.     D=PI2-ARGPER
  390.     A=SIN(D)*SQR(1D0-ECC*ECC)
  391.     B=ECC+COS(D)
  392.     CALL ATAN3(A,B,C)
  393.     D=PI-C+ECC*SIN(C)
  394.     TREL=-.5D0*D*TN/PI
  395.     IF TREL<0D0 THEN TREL=TN+TREL
  396.     A=TREL/3600D0
  397.     THOUR=THOUR+INT(A)
  398.     B=(A-INT(A))*60D0
  399.     TMIN=TMIN+INT(B)
  400.     TSEC=TSEC+INT((B-INT(B))*60D0+.5D0)
  401.     CALL CTIME
  402.     ARGLAT=ARGPER+PI
  403.     A=SIN(ARGLAT)*COS(INC)
  404.     B=COS(ARGLAT)
  405.     CALL ATAN3(A,B,C)
  406.     WLONG=WLONG+C+(WE+RDOT)*TREL
  407.     IF WLONG>=PI2 THEN WLONG=WLONG-PI2
  408.  
  409. END SUB
  410.  
  411. '**********************************************************
  412.  
  413. SUB ATAN3(A,B,C) STATIC
  414.  
  415.     ' FOUR QUADRANT ARC TANGENT SUBROUTINE
  416.  
  417.     IF ABS(A)<1D-8 THEN
  418.        C=(1D0-SGN(B))*PIDIV2
  419.        EXIT SUB
  420.     ELSE
  421.        C=(2D0-SGN(A))*PIDIV2
  422.     END IF
  423.     IF ABS(B)<1D-8 THEN
  424.        EXIT SUB
  425.     ELSE
  426.        C=C+SGN(A)*SGN(B)*(ABS(ATN(A/B))-PIDIV2)
  427.     END IF
  428.  
  429. END SUB
  430.  
  431. '**********************************************************
  432.  
  433. SUB CTIME STATIC
  434.  
  435.     ' TIME SUBROUTINE
  436.  
  437.     IF TSEC>=60D0 THEN
  438.        TSEC=TSEC-60D0
  439.        TMIN=TMIN+1D0
  440.     END IF
  441.     IF TMIN>=60D0 THEN
  442.        TMIN=TMIN-60D0
  443.        THOUR=THOUR+1D0
  444.     END IF
  445.     IF THOUR>=24D0 AND TMIN>0D0 THEN
  446.        THOUR=THOUR-24D0
  447.        JDATE=JDATE+1D0
  448.        PRINT
  449.     END IF
  450.  
  451.     CTIME$=STR$(THOUR)+" h"+STR$(TMIN)+" m"+STR$(TSEC)+" s"
  452.  
  453. END SUB
  454.